Android : Les Activities
Déclarer, appeler, communiquer
L'Activity principale
Lorsque l'on crée un projet Android, l'Activity principale est crée et déclarée automatiquement :
- Après avoir choisi son nom (en général "MainActivity"), la classe est créée, avec certaines méthodes, dont la méthode onCreate.
- Elle est inscrite dans le AndroidManifest.xml, indispensable pour qu'elle soit reconnue par le système Android.
Il est possible de créer autant d'Activity que l'on souhaite pour notre application, à condition de les déclarer dans le manifest.
Le Manifest à la création du projet :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
L'élément interressant se trouve dans application
<activity android:name="com.example.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
On trouve l'activity avec son nom complet (package + class) : com.example.MainActivity
On trouve aussi une balide intent-filter, contenant certaines options pour le système Android :
- action.MAIN pour indiquer à Android que c'est cette Activity qui est la principale, et donc qui doit être lancée au début de l'application
- category.LAUNCHER pour indiquer à Android que c'est cette Activity qui apparaitra dans la liste des applications du terminal.
La plupart du temps, ces 2 options vont ensemble, mais ce n'est pas obligatoire.
Créer et déclarer une nouvelle Activity
On peut créer une nouvelle classe standard dérivant d'Activity, l' ajouter manuellement dans le manifest, mais Eclipse nous offre un moyen de le faire à notre place.
Il suffit donc de choisir File/new.../Android Activity et ensuite de se laisser guider par l'assistant (Blank Activity, puis Choisir le nom de la nouvelle Activity).
Après avoir validé cet écran, plusieurs fichiers ont été crées et modifiés par Eclipse:
- La classe de l'Activity, ici AboutActivity.java a été créée.
- Le layout xml correspondant, ici res/layout/activity_about.xml a été créé.
- Le AndroidManifest.xml contient maintenant la nouvelle activity.
- Le fichier values/strings.xml contient maintenant une nouvelle entrée, correspondant au titre de notre nouvelle Activity.
Le manifest avec 2 activities :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.AboutActivity" android:label="@string/title_activity_about" > </activity> </application> </manifest>
Activity et Intent
Pour communiquer entre plusieurs Activities de notre application ou celles d'autres applications, Android utilise le mécanisme d'Intent.
Ce système permet de lancer une autre Activity de notre application, ou de profiter des autres applications installées sur le terminal, comme par exemple la téléphonie, le navigateur internet, le carnet d'adresse, et bien s'autres.
Appeler directement une autre Activity de notre application
Chaque Activity possède une méthode startActivity qu'il faut appeller avec un objet intermédiare Intent.
Pour lancer une autre Activity de notre application, il suffit de préciser la classe de celle ci :
//lance l'activity AboutActivity Intent i = new Intent(this, AboutActivity.class); startActivity(i);
Ce code peut-être placé n'importe ou dans l'Activity appellante, dans le onCreate, ou dans un onClick par exemple.
Lorsque l'on crée un Intent, il faut oligatoirement lui passer l'Activity appellante (this).
Lorsque ce code est exécuté, la nouvelle Activity s'ouvre et se place "devant" l'autre. L'utilisateur peut alors utiliser le bouton "retour" de son terminal pour revenir à l'Activity précédente.
Demander à l'OS de résoudre notre demande
Depuis notre application, on peut avoir besoin d'utiliser des applications externes pour certains besoins. Le cas typique est l'utilisation du navigateur web ou du téléphone.
Plutot que demander à l'OS d'ouvrir un programme particulier, on demande à Android d'ouvrir une URI particulière.
Les URI
Une URI (Uniform Resource Identifier) représente un identifiant et un protocole :
Une addresse internet par exemple identifie un identifiant (le nom de domaine), et un protocole (http, la plupart du temps)
Android supporte aussi d'autres URI, comme par exemple mailto: ou tel:
Voici quelques exemples d'URI :
- http://www.google.fr
- mailto:toto@hotmal.com
- tel:0661123456
- content://contacts/people/
- etc...
L'avantage de ce systeme c'est que l'application qui s'ouvre va dépendre de l'utilisateur. S'il n'y a qu'une seule application installée capable de gérer un protocole donné, elle sera lancée. S'il y en a plusieurs, c'est l'utilisateur qui choisira.
En plus de spécifier une URI, il faut spécifier une action sur cette URI. Souvent on utilise l'action Intent.ACTION_VIEW, mais d'autres actions sont disponibles (EDIT par exemple).
Par exemple pour afficher une page web :
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.fr")); startActivity(i);
ou pour composer un numéro de téléphone :
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:0661123456")); startActivity(i);
Plus d'infos : http://developer.android.com/guide/appendix/g-app-intents.html, http://developer.android.com/guide/components/intents-filters.html, http://www.vogella.com/articles/AndroidIntent/article.html.
Aller plus loin
Envoyer des données en lancant une Activity
Il est possible de passer des valeurs à destination de l'autre Activity :
Intent i = new Intent(this, AboutActivity.class); i.putExtra("Clé 1", "Une valeur"); i.putExtra("Clé 2", "Une autre valeur"); startActivity(i);
Et de les récupérer de l'autre côté, dans la méthode onCreate ...
Bundle extras = getIntent().getExtras(); if (extras == null) { return; } String myData = extras.getString("Clé 1"); if (myData != null) { System.out.println(myData); }
Recevoir des données en lancant une Activity
Avec la méthode startActivityForResult et la méthode onActivityResult.Plus d'infos sur http://developer.android.com/reference/android/app/Activity.html#StartingActivities
TP
Cahier des charges :
Créer une application "MaCarteDeVisite" :
- La page principale affiche mon nom et prénom, ainsi qu'une courte phrase de présentation.
- Il y a un bouton sur cette page : "Plus d'informations".
- Le bouton "Plus d'informations" ouvre une autre page avec d'autres informations sur moi et un bouton "Téléphonez moi"
- Le bouton "Téléphonez moi" ouvre le clavier numérique avec mon numéro de téléphone pré-rempli.
Etapes :
- Créer le projet "MaCarteDeVisite", avec une activity "MainActivity" de base.
- Modifier le contenu du layout correspondant pour afficher un texte et le bouton.
- Créer une nouvelle Activity "MoreInfoActivity".
- Modifier le contenu du layout de cette nouvelle activity avec un texte et un bouton.
- Modifier MainActivity pour être informé du click sur le bouton (findViewById, setOnClickListener, onClickListener, onClick)
- Dans le onClick de MainActivity, lancer l'autre activity MoreInfoActivity (new Intent, startActivity)
- Modifier MoreInfoActivity pour être informé du click sur le bouton.
- Dans le onClick de MoreInfoActivity, lancer l'intent avec un numéro de téléphone.